"""
颜色工具模块
提供16进制颜色转换和验证功能
"""

import re
from typing import Tuple


class ColorUtils:
    """颜色工具类"""
    
    @staticmethod
    def validate_hex_color(hex_color: str) -> bool:
        """
        验证16进制颜色格式
        
        Args:
            hex_color (str): 16进制颜色值，如 #FF0000 或 FF0000
            
        Returns:
            bool: 格式是否正确
        """
        if not hex_color:
            return False
            
        # 移除#号并检查长度
        hex_color = hex_color.lstrip('#')
        
        # 支持3位或6位16进制
        if len(hex_color) == 3:
            # 3位扩展为6位
            hex_color = ''.join([c*2 for c in hex_color])
        elif len(hex_color) != 6:
            return False
            
        # 检查是否为有效的16进制字符
        pattern = r'^[0-9A-Fa-f]{6}$'
        return bool(re.match(pattern, hex_color))
    
    @staticmethod
    def hex_to_rgb(hex_color: str) -> Tuple[int, int, int]:
        """
        16进制颜色转RGB值
        
        Args:
            hex_color (str): 16进制颜色值
            
        Returns:
            Tuple[int, int, int]: RGB值 (R, G, B)
            
        Raises:
            ValueError: 颜色格式无效
        """
        if not ColorUtils.validate_hex_color(hex_color):
            raise ValueError(f"无效的颜色格式: {hex_color}")
            
        hex_color = hex_color.lstrip('#')
        
        # 3位扩展为6位
        if len(hex_color) == 3:
            hex_color = ''.join([c*2 for c in hex_color])
            
        # 转换为RGB
        r = int(hex_color[0:2], 16)
        g = int(hex_color[2:4], 16)
        b = int(hex_color[4:6], 16)
        
        return (r, g, b)
    
    @staticmethod
    def rgb_to_hex(r: int, g: int, b: int) -> str:
        """
        RGB值转16进制颜色
        
        Args:
            r (int): 红色值 (0-255)
            g (int): 绿色值 (0-255)
            b (int): 蓝色值 (0-255)
            
        Returns:
            str: 16进制颜色值
            
        Raises:
            ValueError: RGB值超出范围
        """
        if not all(0 <= val <= 255 for val in [r, g, b]):
            raise ValueError("RGB值必须在0-255范围内")
            
        return f"#{r:02X}{g:02X}{b:02X}"
    
    @staticmethod
    def normalize_hex_color(hex_color: str) -> str:
        """
        标准化16进制颜色格式
        
        Args:
            hex_color (str): 原始颜色值
            
        Returns:
            str: 标准化的6位16进制颜色值
        """
        if not ColorUtils.validate_hex_color(hex_color):
            raise ValueError(f"无效的颜色格式: {hex_color}")
            
        hex_color = hex_color.lstrip('#')
        
        # 3位扩展为6位
        if len(hex_color) == 3:
            hex_color = ''.join([c*2 for c in hex_color])
            
        return f"#{hex_color.upper()}"